import axios from 'axios'
import { checkStatus } from './status'

import type { AxiosInstance, AxiosError } from 'axios'

const request: AxiosInstance = axios.create({
  // baseURL: `/v1`, // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  timeout: 30000, // 请求超时时间
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    post: {
      'Content-Type': 'application/json',
    },
  },
})

/* 请求拦截器 */
request.interceptors.request.use(
  (config) => {
    // 添加请求token
    // config.headers.Authorization = `Bearer xxxxxx`
    // config.data = qs.stringify(config.data)
    let url = config.url
    if (config.method == 'get' && config.params) {
      url += '?'
      let keys = Object.keys(config.params)
      for (let key of keys) {
        url += `${key}=${encodeURIComponent(config.params[key])}`
      }
      config.params = {}
    }
    config.url = url
    return config
  },
  (error: AxiosError) => {
    // 捕获请求前的错误
    ElMessage.error(error)
  },
)

/* 响应拦截器 */
request.interceptors.response.use(
  (response) => {
    // 结构出请求状态码、错误提示以及我们所需要的数据
    const { data } = response
    if (data.code == 200 || data.code == 0) {
      // 请求成功，这里可以进行数据过滤
      return data.data
    } else {
      // 处理业务错误。
      const msg = checkStatus(data.code)
      // 全局提醒错误
      if (data.code == 4001) {
        ElMessage.error(data.message)
      } else {
        ElMessage.error(msg)
      }
      return response
    }
  },
  (error: AxiosError) => {
    // 捕获到抛出的错误
    Promise.reject(error)
  },
)

export default request
